package com.lesama.minterface.jdk8;

/*
* JDK8后接口的新特性：
* 1. 可以在接口中定义函数体了，不过需要使用default关键字修饰，表示默认方法，方法默认用public修饰
*    这是为了方便在版本更新时若需要丰富接口的功能，而不想重写每个实现类中的方法，默认方法可以不被重写
*    由于实现是可以多实现的，因此多个接口若有同名的默认方法，这时实现类必须重写该默认方法
*    可以通过接口名.super.方法名来调用到接口中的方法，因为接口不能实例化，所以实现类的super一般是Object
* 2. 由于已经可以定义函数体，因此在接口中也可以实现静态方法
*    但是该静态方法只能通过类名调用，不能通过实现类的对象调用,
*    这是因为静态方法通过类型调用在字节码中会转换为类名调用，但是如果使用实现类对象调用的话是无法转换的
* */

public class InterfaceDemo1 {
    public static void main(String[] args) {
        AInterImpl aInter = new AInterImpl();
        aInter.method();
        BInterImpl bInter = new BInterImpl();
        bInter.method();
        Inter.print();
    }
}

interface Inter {
    default void method() {
        System.out.println("Inter method");
    }
    static void print() {
        System.out.println("print method");
    }
}

interface A {
    default void method() {
        System.out.println("A method");
    }
}

class AInterImpl implements Inter, A {
    @Override
    public void method() {
        Inter.super.method();
        A.super.method();
        System.out.println("AImpl...");
    }
}

class BInterImpl implements Inter, A {
    @Override
    public void method() {
        Inter.super.method();
        A.super.method();
        System.out.println("BImpl...");
    }
}

